package com.spring.context.impl;


import com.spring.reader.AnnotationBeanDefinitionReader;
import lombok.extern.slf4j.Slf4j;

import java.time.Instant;
import java.time.LocalDateTime;

/**
 * 注解上下文:
 * 需要一个解析注解的对象来解析
 *
 * 就是用它来启动spring 容器工作
 */

@Slf4j
public class AnnotationApplicationContext extends AbstractApplicationContext {
	private final AnnotationBeanDefinitionReader reader;
	
	private long startTime;
	
	private AnnotationApplicationContext() {
		// 计时启动时间
		startTime = Instant.now().toEpochMilli();
		this.reader = new AnnotationBeanDefinitionReader(this);
	}
	
	
	/**
	 * 构造方法
	 *
	 * @param annotationClasses 必须是注解了 @Configuration 的类
	 */
	public AnnotationApplicationContext(Class<?>... annotationClasses) {
		this();
		// 配置类.class 传递给解析类去解析,加载所有的类定义
		log.info("加载并处理启动配置类信息");
		reader.register(annotationClasses);
		
		// 刷新容器，开始容器入口方法
		refresh();
		
		// 统计耗时时间
		long elapsedTime = Instant.now().toEpochMilli() - startTime;
		log.info("容器启动完成，用时 {} ms", elapsedTime);
	}
}
